﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using ProgNetComponents.Data.SqlCe;
using ProgNetComponentsDx.Browsers;
using Wydatki.Init;

namespace Wydatki.Tools
{
    public class WydatkiTools
    {
        private static SqlCeDataManager _Manager;
        private static SqlCeDataManager Manager
        {
            get
            {
                if (_Manager == null)
                {
                    _Manager = new SqlCeDataManager();
                    _Manager.AutoLogExceptions = true;
                    _Manager.AutoCommit = false;
                    _Manager.AddTableDef(Produkty.STP_PRODUKTY);
                    _Manager.AddTableDef(Produkty.STP_PROD_KAT);
                    _Manager.AddTableDef(Sklepy.STP_SKLEPY);
                    _Manager.AddTableDef(BrowserCache.GetBrowserData(Init.InitFormBrowserNames.Glowna.KategorieProduktow), "STP_KATEGORIE_PRODUKTOW", "SELECT * FROM STP_KATEGORIE_PRODUKTOW");
                }
                return _Manager;
            }
        }

        private static Zakupy.DataSets.ZakupyDataSet Zakupy = new Zakupy.DataSets.ZakupyDataSet();
        private static Setup.DataSets.ProduktyDataSet Produkty = new Setup.DataSets.ProduktyDataSet();
        private static Setup.DataSets.SklepyDataSet Sklepy = new Setup.DataSets.SklepyDataSet();

        public static bool ProcessNewProducts(Zakupy.DataSets.ZakupyDataSet zakupy, 
            Setup.DataSets.ProduktyDataSet produkty, 
            Setup.DataSets.SklepyDataSet sklepy,
            bool showProductDlg = true)
        {
            DataTable kategorie = BrowserCache.GetBrowserData(Init.InitFormBrowserNames.Glowna.KategorieProduktow);

            DataRow[] rowsProdukty = produkty.STP_PRODUKTY.Select(null, null, DataViewRowState.Added);
            DataRow[] rowsSklepy = sklepy.STP_SKLEPY.Select(null, null, DataViewRowState.Added);
            DataRow[] rowsKategorie = kategorie.Select(null, null, DataViewRowState.Added);

            Dictionary<DataRow, DataRow[]> refsProdukty = new Dictionary<DataRow, DataRow[]>();
            Dictionary<DataRow, DataRow[]> refsSklepy = new Dictionary<DataRow, DataRow[]>();
            Dictionary<DataRow, DataRow[]> refsKategorie = new Dictionary<DataRow, DataRow[]>();

            DataRow[] rows2;
            
            foreach (DataRow r in rowsProdukty)
            {
                rows2 = zakupy.WRK_WYDATKI_PRODUKTY.Select("WRK_WYD_PROD_PRODUKT = " + r["STP_PROD_ID"].AsString().EscapeSql(),
                    null, DataViewRowState.CurrentRows);
                if (rows2.Length > 0)
                {
                    refsProdukty.Add(r, rows2);
                }
                else
                {
                    r.Delete();
                }
            }
            foreach (DataRow r in rowsSklepy)
            {
                rows2 = zakupy.WRK_WYDATKI.Select("WRK_WYD_SKLEP = " + r["STP_SKL_ID"].AsString().EscapeSql(),
                    null, DataViewRowState.CurrentRows);
                if (rows2.Length > 0)
                {
                    refsSklepy.Add(r, rows2);
                }
                else
                {
                    r.Delete();
                }
            }
            bool result = true;
            Manager.AutoCommit = false;
            Manager.StartTransaction();

            if (refsProdukty.Count > 0)
            {
                if (showProductDlg)
                {
                    FormNoweProdukty f = new FormNoweProdukty(produkty);
                    f.ShowDialog();
                    rowsKategorie = kategorie.Select(null, null, DataViewRowState.Added);
                    foreach (DataRow r in rowsKategorie)
                    {
                        rows2 = produkty.STP_PROD_KAT.Select("STP_PRODK_KATEGORIA = " + r["STP_KAT_PROD_ID"].AsString().EscapeSql(),
                            null, DataViewRowState.CurrentRows);
                        if (rows2.Length > 0)
                        {
                            refsKategorie.Add(r, rows2);
                        }
                        else
                        {
                            r.Delete();
                        }
                    }
                }
                if (!Manager.UpdateTable(kategorie))
                {
                    result = false;
                }
                else
                {
                    foreach (KeyValuePair<DataRow, DataRow[]> kvp in refsKategorie)
                    {
                        foreach (DataRow r in kvp.Value)
                        {
                            r["STP_PRODK_KATEGORIA"] = kvp.Key["STP_KAT_PROD_ID"];
                        }
                    }
                }
                
                if (result)
                {
                    if (!Manager.UpdateDataSet(produkty))
                    {
                        result = false;
                    }
                }
            }
            if (result)
            {
                if (!Manager.UpdateDataSet(sklepy))
                {
                    result = false;
                }
            }
            if (result)
            {
                Manager.Commit();
                ProgNetComponentsDx.Browsers.BrowserCache.RefreshCache(produkty);
                ProgNetComponentsDx.Browsers.BrowserCache.RefreshCacheForBrowser(Init.InitFormBrowserNames.Glowna.KategorieProduktow);

                foreach (KeyValuePair<DataRow, DataRow[]> kvp in refsProdukty)
                {
                    foreach (DataRow r in kvp.Value)
                    {
                        r["WRK_WYD_PROD_PRODUKT"] = kvp.Key["STP_PROD_ID"];
                    }
                }
                produkty.Clear();
                produkty.AcceptChanges();

                ProgNetComponentsDx.Browsers.BrowserCache.RefreshCache(sklepy);
                foreach (KeyValuePair<DataRow, DataRow[]> kvp in refsSklepy)
                {
                    foreach (DataRow r in kvp.Value)
                    {
                        r["WRK_WYD_SKLEP"] = kvp.Key["STP_SKL_ID"];
                    }
                }
                sklepy.Clear();
                sklepy.AcceptChanges();
            }
            else
            {
                Manager.Rollback();
            }
            return result;
        }

        public static void ProcessNewWydatki(WRK.Praca.DataSets.WrkKpirDataSet kpir)
        {
            Zakupy.Clear();
            Produkty.Clear();
            Sklepy.Clear();
            Zakupy.AcceptChanges();
            Produkty.AcceptChanges();
            Sklepy.AcceptChanges();

            DataRow[] rows = kpir.WRK_KPIR.Select("DODAJ_DO_WYDATKOW = 1", null, DataViewRowState.Added);
            DataRow[] kwoty;
            DataRow wydatek;
            DataRow wydProd;
            string typ;
            decimal suma = 0;
            Browser br = BrowserCache.GetBrowser(InitFormBrowserNames.Glowna.LataPodatkowe);
            DataRow rokPodatkowy;
            int sklep;

            foreach (DataRow r in rows)
            {
                kwoty = kpir.WRK_KPIR_KWOTY.Select("WRK_KPIRK_FAKTURA = " + r["WRK_KPIR_ID"].AsString().EscapeSql());
                if (kwoty.Length > 0)
                {
                    suma = 0;

                    rokPodatkowy = br.GetRowForValue(r["WRK_KPIR_DATA"].AsDateTime(DateTime.Now).Year);
                    if (rokPodatkowy != null)
                    {
                        foreach (DataRow k in kwoty)
                        {
                            typ = k["WRK_KPIRK_TYP"].AsString();
                            if (typ == "ZT" || typ == "PW")
                            {
                                suma += decimal.Round(k["WRK_KPIRK_KWOTA_NETTO"].AsDecimal() * ((decimal)1 + rokPodatkowy["STP_LP_VAT_S3"].AsDecimal()), 2);
                            }
                        }
                        if (suma > 0)
                        {
                            wydatek = Zakupy.WRK_WYDATKI.NewRow();
                            wydatek["WRK_WYD_DATA"] = r["WRK_KPIR_DATA"];
                            sklep = GetSklep(r["WRK_KPIR_KONTRACHENT"]);
                            if (sklep > -1)
                            {
                                wydatek["WRK_WYD_SKLEP"] = sklep;
                            }
                            Zakupy.WRK_WYDATKI.Rows.Add(wydatek);
                            wydProd = Zakupy.WRK_WYDATKI_PRODUKTY.NewRow();
                            wydProd["WRK_WYD_PROD_WYDATEK"] = wydatek["WRK_WYD_ID"];
                            wydProd["WRK_WYD_PROD_ILOSC"] = 1;
                            wydProd["WRK_WYD_PROD_CENA_JEDNOSTKOWA"] = suma;
                            wydProd["WRK_WYD_PROD_PRODUKT"] = GetProdukt(r["WRK_KPIR_OPIS"].AsString(), Produkty);
                            Zakupy.WRK_WYDATKI_PRODUKTY.Rows.Add(wydProd);
                        }
                    }
                }
            }
            
            if (Zakupy.WRK_WYDATKI.Rows.Count > 0)
            {
                FormNoweWydatki f = new FormNoweWydatki(Zakupy, Produkty, Sklepy);
                f.ShowDialog();
            }
        }
        public static void ProcessNewWydatki(WRK.Praca.DataSets.WrkVatzDataSet ds)
        {
            Zakupy.Clear();
            Produkty.Clear();
            Zakupy.AcceptChanges();
            Produkty.AcceptChanges();

            DataRow[] rows = ds.WRK_VATZ.Select("DODAJ_DO_WYDATKOW = 1", null, DataViewRowState.Added);
            DataRow[] kwoty;
            DataRow wydatek;
            DataRow wydProd;
            string typ;
            decimal suma = 0;
            Browser br = BrowserCache.GetBrowser(InitFormBrowserNames.Glowna.LataPodatkowe);
            int sklep;

            foreach (DataRow r in rows)
            {
                kwoty = ds.WRK_VATZ_KWOTY.Select("WRK_VATZK_FAKTURA = " + r["WRK_VATZ_ID"].AsString().EscapeSql());
                if (kwoty.Length > 0)
                {
                    suma = 0;

                    foreach (DataRow k in kwoty)
                    {
                        typ = k["WRK_VATZK_TYP_KPIR"].AsString();
                        if (typ == "ZT" || typ == "PW")
                        {
                            suma += decimal.Round(k["WRK_VATZK_KWOTA_NETTO"].AsDecimal() * ((decimal)1 + k["WRK_VATZK_STAWKA_VAT"].AsDecimal()), 2);
                        }
                    }
                    if (suma > 0)
                    {
                        wydatek = Zakupy.WRK_WYDATKI.NewRow();
                        wydatek["WRK_WYD_DATA"] = r["WRK_VATZ_DATA_WYSTAWIENIA"];
                        sklep = GetSklep(r["WRK_VATZ_SPRZEDAWCA"]);
                        if (sklep > -1)
                        {
                            wydatek["WRK_WYD_SKLEP"] = sklep;
                        }
                        Zakupy.WRK_WYDATKI.Rows.Add(wydatek);
                        wydProd = Zakupy.WRK_WYDATKI_PRODUKTY.NewRow();
                        wydProd["WRK_WYD_PROD_WYDATEK"] = wydatek["WRK_WYD_ID"];
                        wydProd["WRK_WYD_PROD_ILOSC"] = 1;
                        wydProd["WRK_WYD_PROD_CENA_JEDNOSTKOWA"] = suma;
                        wydProd["WRK_WYD_PROD_PRODUKT"] = GetProdukt(r["WRK_VATZ_OPIS"].AsString(), Produkty);
                        Zakupy.WRK_WYDATKI_PRODUKTY.Rows.Add(wydProd);
                    }
                }
            }

            if (Zakupy.WRK_WYDATKI.Rows.Count > 0)
            {
                FormNoweWydatki f = new FormNoweWydatki(Zakupy, Produkty, Sklepy);
                f.ShowDialog();
            }
        }

        public static int GetProdukt(string name, Setup.DataSets.ProduktyDataSet Produkty)
        {
            Browser b = BrowserCache.GetBrowser(InitFormBrowserNames.Glowna.Produkty);
            DataRow r= b.GetTable().SelectFirstRow(b.DisplayMember + " = " + name.EscapeSql());
            if (r != null)
            {
                return r[b.ValueMember].AsInt();
            }
            else
            {
                r = Produkty.STP_PRODUKTY.AddSTP_PRODUKTYRow(name.AsString());
                b.GetTable().ImportRow(r);
                return r[b.ValueMember].AsInt();
            }
        }
        public static int GetSklep(string name, Setup.DataSets.SklepyDataSet Sklepy)
        {
            Browser b = BrowserCache.GetBrowser(InitFormBrowserNames.Glowna.Sklepy);
            DataRow r = b.GetTable().SelectFirstRow(b.DisplayMember + " = " + name.EscapeSql());
            if (r != null)
            {
                return r[b.ValueMember].AsInt();
            }
            else
            {
                r = Sklepy.STP_SKLEPY.AddSTP_SKLEPYRow(name.AsString(), "");
                b.GetTable().ImportRow(r);
                return r[b.ValueMember].AsInt();
            }
        }
        private static int GetSklep(object kontrachent)
        {
            Browser b = BrowserCache.GetBrowser(InitFormBrowserNames.Glowna.Kontrachenci);
            DataRow r = b.GetRowForValue(kontrachent);
            if (r != null)
            {
                return r["STP_KON_SKLEP"].AsInt(-1);
            }
            return -1;
        }
    }
}
